[PySide6]QMainWindow - 功能表


Posted by Yen on 2024-01-07

功能表

在一般的視窗中,功能表是指放在最上面的功能列表,如下圖:

這是我從其他軟體偷來的圖片,很清楚的顯示了功能表的長相。

初談訊號與槽

要在QMainWindow中添加功能表,首先要先創造一個QAction物件,這個物件掌管了訊號(signal)與槽(slot)之間的串接。訊號與槽是Qty在主迴圈中控制行為與反應的方式,比起其他框架用的callback方法,訊號與槽很簡潔並明瞭的串接了一個物件所發出來的訊號(行為)和槽(反應)。在談QAction之前,我們可以先看一個簡單的按按鈕程式碼。

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton, QLabel

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        button = QPushButton("按我", self)
        button.clicked.connect(self.button_clicked)

    def button_clicked(self):
        self.dialog = QDialog(self)
        self.dialog.setWindowTitle("對話視窗")
        label = QLabel("你按了按鈕", self.dialog)
        self.dialog.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_win = MainWindow()
    main_win.show()
    sys.exit(app.exec())

button.clicked.connect()這個方法來看,顧名思義,就是將按鈕備案下的這個訊號連接到參數提供的槽,而這次使用的槽的名稱叫做button_clicked(),它會建立一個QDialog的對話視窗,並顯示「你按了按鈕」字樣。在PySide6中,QPushButton是繼承自QAbstractButton類別,而QAbstractButton類別定義了內建的訊號clicked,所以我們才可以在這裡使用button.clicked這個訊號。順帶一提,訊號和槽可以是一對一,多對一或是一對多的關係,是十分靈活的一個機制。

QAction

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QDialog, QLabel
from PySide6.QtGui import QAction

class MenuWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setup_main_ui()

    def setup_main_ui(self):
        self.setWindowTitle("Yen.Studio")
        self.resize(800, 600)

        menu = self.menuBar()
        menu_action = self.setup_action()
        action_menu = menu.addMenu("&Action")
        action_menu.addAction(menu_action)

    def setup_action(self):
        action = QAction("Click Me", self)
        action.triggered.connect(self.on_item_clicked)
        return action

    def on_item_clicked(self):
        self.dialog = QDialog(self)
        self.dialog.setWindowTitle("對話視窗")
        label = QLabel("你按了按鈕", self.dialog)
        self.dialog.show()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    menu_win = MenuWindow()
    menu_win.show()
    sys.exit(app.exec())

從這段程式碼可以看到,在setup_action方法中,我們定義了一個QAction,並且將它的triggered信號連結到槽方法,然後在action_menu中加入這個QAction。如此一來,我們的視窗就有了一個功能表,而在action_menu = menu.addMenu(”&Action”)這裡,在名稱字串的前面加上&符號,代表設定成快捷鍵,在這裡就是Alt+A。

這篇文章簡單的談了視窗要怎麼加入功能表,以及訊號與槽的機制,之後我們會討論更多有關於更複雜的功能表,以及更多訊號和槽的應用。


#Python #gui #pyside







Related Posts

網路觀念

網路觀念

學習 Git (1) - 安裝 Git & 基本設定

學習 Git (1) - 安裝 Git & 基本設定

box model、display 的三種形式、定位(position)

box model、display 的三種形式、定位(position)


Comments